package com.example.service;

import com.example.model.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.jws.soap.SOAPBinding;

/**
 * @author : frosty0804@gmail.com
 * @version : v1.0
 * @projectName : Learn
 * @className : UserService
 * @description : TODO(使用一句话概括这个类)
 * @date : 2020/3/27 13:07
 */
@Slf4j
@Service
public class UserService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Resource(name = "redisTemplate")
    private ValueOperations<String, String> strTemplate;

    @Resource(name = "redisTemplate")
    public HashOperations<String, String, User> hashTemplate;


    /**
     * 需求：
     * 用户输入一个key
     * 先判断Redis中是否存在该key
     * 如果存在，则在Redis中进行查询，并返回该值
     * 如果不存在，则在MySQL数据库进行查询，并将查询到的值赋给Redis然后返回
     *
     * @param key 请求Redis的key
     * @return Redis中存在的key对应值
     */
    public String getString(String key) {
        String value = null;
        try {
            // hasKey和existe类似，都是用来判断key是否存在
            if (redisTemplate.hasKey(key)) {
                log.info("key存在于Redis数据库");
//                value = String.valueOf(redisTemplate.opsForValue().get(key));
                value = strTemplate.get(key);
            } else {
                log.info("key不存在于Redis数据库，向MySQL查询数据");
                value = "我是一个没的感情的测试数据";
                log.info("将数据添加到Redis数据库");
//                redisTemplate.opsForValue().set(key, value);
                strTemplate.set(key, value);
            }
        } catch (Exception e) {
            log.error("Redis数据库访问异常", e);
        }
        return value;
    }

    /**
     * 测试hash类型
     *
     * @param id 传入要查询的用户ID号码
     * @return 用户信息
     */
    public User queryId(String id) {
        User user = new User();
        try {
            // 进行判断，是否存在对应的对象以及对象中的字段
            if (redisTemplate.opsForHash().hasKey("user", id)) {
                log.info("Redis中存在对应的对象数据，查询Redis");
//                user = (User) redisTemplate.opsForHash().get("user", id);
                user = hashTemplate.get("user", id);
            } else {
                log.info("Redis中不存在对应的数据，查询MySQL数据库");
                user.setId(id);
                user.setName("张三");
                user.setAge("22");
                /**
                 * @param h 存储的对象名称
                 * @param hk 用户的主键
                 * @param hv 要存储的对象
                 */
//                redisTemplate.opsForHash().put("user", id, user);
                hashTemplate.put("user", id, user);
            }
        } catch (Exception e) {
            log.error("Redis数据库访问异常", e);
        }
        return user;

    }
}
